home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AOL File Library: 2,801 to 2,900
/
aol-file-protocol-4400-2801-to-2900.zip
/
AOLDLs
/
C++ Files Library
/
Graphic Gems I, II & III (C_C++)
/
Graphics Gems C Code.sea
/
GemsI
/
Src
/
MatrixOrtho.c
< prev
next >
Wrap
Text File
|
1992-06-16
|
1KB
|
51 lines
/*
Matrix Orthogonalization
Eric Raible
from "Graphics Gems", Academic Press, 1990
*/
/*
* Reorthogonalize matrix R - that is find an orthogonal matrix that is
* "close" to R by computing an approximation to the orthogonal matrix
*
* T -1/2
* RC = R(R R)
* T -1
* [RC is orthogonal because (RC) = (RC) ]
* -1/2
* To compute C, we evaluate the Taylor expansion of F(x) = (I + x)
* (where x = C - I) about x=0.
* This gives C = I - (1/2)x + (3/8)x^2 - (5/16)x^3 + ...
*/
#include "GraphicsGems.h"
static float coef[10] = /* From mathematica */
{ 1, -1/2., 3/8., -5/16., 35/128., -63/256.,
231/1024., -429/2048., 6435/32768., -12155/65536. };
MATRIX_reorthogonalize (R, limit)
Matrix R;
{
Matrix I, Temp, X, X_power, Sum;
int power;
limit = MAX(limit, 10);
MATRIX_transpose (R, Temp); /* Rt */
MATRIX_multiply (Temp, R, Temp); /* RtR */
MATRIX_identify (I);
MATRIX_subtract (Temp, I, X); /* RtR - I */
MATRIX_identify (X_power); /* X^0 */
MATRIX_identify (Sum); /* coef[0] * X^0 */
for (power = 1; power < limit; ++power)
{
MATRIX_multiply (X_power, X, X_power);
MATRIX_constant_multiply (coef[power], X_power, Temp);
MATRIX_add (Sum, Temp, Sum);
}
MATRIX_multiply (R, Sum, R);
}